/**
 * 
 */
package com.lanswon.qzsmk.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.lanswon.qzsmk.exception.SystemException;

/**
 * @author sun
 *
 */
public class ZipUtil {
	 private static final Logger log = LoggerFactory.getLogger(ZipUtil.class);
	 
	    private ZipUtil(){};
	   /**
	     * 创建ZIP文件
	     * @param sourcePath 文件或文件夹路径
	     * @param zipPath 生成的zip文件存在路径（包括文件名）
	     */
	    public static void createZip(String sourcePath, String zipPath) {
	        FileOutputStream fos = null;
	        ZipOutputStream zos = null;
	        try {
	            fos = new FileOutputStream(zipPath);
	            zos = new ZipOutputStream(fos);
	            zos.setEncoding("gbk");//此处修改字节码方式。
	            //createXmlFile(sourcePath,"293.xml");
	            writeZip(new File(sourcePath), "", zos);
	        } catch (FileNotFoundException e) {
	        	e.printStackTrace();
	            String msg1="创建ZIP文件失败";
				log.error(msg1);
				throw new SystemException(SystemException.FileNotFoundException, msg1);

	        } finally {
	            try {
	                if (zos != null) {
	                    zos.close();
	                }
	            } catch (IOException e) {
	            	e.printStackTrace();
	                String msg1="IO流关闭异常";
					log.error(msg1);
					throw new SystemException(SystemException.IOException, msg1);

	            }
	 
	        }
	    }
	 
	    private static void writeZip(File file, String parentPath, ZipOutputStream zos) {
	        if(file.exists()){
	            if(file.isDirectory()){//处理文件夹
	                parentPath+=file.getName()+File.separator;
	                File [] files=file.listFiles();
	                if(files.length != 0)
	                {
	                	for(File f:files){
	                        writeZip(f, parentPath, zos);
	                    }
	                }
	                else
	                {       //空目录则创建当前目录
							try {
								zos.putNextEntry(new ZipEntry(parentPath));
							} catch (IOException e) {
								e.printStackTrace();
								 String msg1="IO流关闭异常";
				 					log.error(msg1);
				 					throw new SystemException(SystemException.FileNotFoundException, msg1);

							}
	                }
	            }else{
	                FileInputStream fis=null;
	                try {
	                    fis=new FileInputStream(file);
	                    ZipEntry ze = new ZipEntry(parentPath + file.getName());
	                    zos.putNextEntry(ze);
	                    byte [] content=new byte[1024];
	                    int len;
	                    while((len=fis.read(content))!=-1){
	                        zos.write(content,0,len);
	                        zos.flush();
	                    }
	 
	                } catch (FileNotFoundException e) {
	                	e.printStackTrace();
	                	 String msg1="IO流关闭异常";
	 					log.error(msg1);
	 					throw new SystemException(SystemException.FileNotFoundException, msg1);

	                } catch (IOException e) {
	                	e.printStackTrace();
	                	 String msg1="IO流关闭异常";
	 					log.error(msg1);
	 					throw new SystemException(SystemException.IOException, msg1);

	                }finally{
	                    try {
	                        if(fis!=null){
	                            fis.close();
	                        }
	                    }catch(IOException e){
	                    	e.printStackTrace();
	                    	 String msg1="IO流关闭异常";
	     					log.error(msg1);
	     					throw new SystemException(SystemException.IOException, msg1);

	                    }
	                }
	            }
	        }
	    } 
		
}
